//
// Created by Hello on 2024/2/8.
//
#include <iostream>

using namespace std;

#define MaxSize 100     // 队列容量
// 循环队列类模板
template <typename T>
class CSqQueue
{
private:
    T *data;    // 存放队中元素
    int front, rear;    // 对头和队尾指针
public:
    // 构造函数
    CSqQueue()
    {
        data = new T[MaxSize];  //为data分配容量为MaxSize的空间
        front = rear = 0;   //队头队尾指针置初值
    }
    // 析构函数
    ~CSqQueue()
    {
        delete [] data;
    }
    //----------循环队基本运算算法-----------------
    bool empty()    // 判断队列为空
    {
        return front == rear;
    }
    bool push(T e)  // 进队列运算
    {
        if((rear+1)%MaxSize == front)   // 队列满上溢出
            return false;
        rear = (rear + 1) % MaxSize;
        data[rear] = e;
        return true;
    }
    bool pop(T &e)  // 出队列运算
    {
        if(front == rear) // 队空下溢出
            return false;
        front = (front + 1) % MaxSize;
        e = data[front];
        return true;
    }
    bool gethead(T &e)  // 取对头运算
    {
        if(front == rear)   // 队空下溢出
            return false;
        int head = (front + 1) % MaxSize;
        e = data[head];
        return true;
    }
    //-----------扩展运算-------------
    // 计算队列中元素个数
    int getlength()
    {
        return (rear - front + MaxSize) % MaxSize;
    }
};